package com.yt.product.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.yt.common.enums.CodeEnum;
import com.yt.common.exception.BusinessException;
import com.yt.common.utils.StrUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import javax.annotation.Resource;
import com.yt.product.common.config.YmlConfig;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yt.product.mapper.ProductCategoryMapper;
import com.yt.product.models.service.IProductCategoryService;
import com.yt.product.models.bo.ProductCategorySaveBO;
import com.yt.product.models.dto.ProductCategoryDTO;

import java.util.Date;

/**
 * 产品类型信息控制器
 *
 * @author chen
 * @Date 2025-09-05 14:09:10
 */
@DubboService
public class ProductCategoryServiceImpl extends ServiceImpl<ProductCategoryMapper, ProductCategoryDTO> implements IProductCategoryService {

    @Resource
    private YmlConfig ymlConfig;

    @Override
    public boolean add(ProductCategorySaveBO saveBO) {
        // 参数校验
        validateSaveBO(saveBO);

        ProductCategoryDTO dto = new ProductCategoryDTO();
        BeanUtils.copyProperties(saveBO, dto);

        // 设置默认值
        setDefaultValues(dto);

        // 生成ID
        dto.setId(ymlConfig.getPkId());
        return this.insert(dto);
    }

    // 参数校验逻辑
    private void validateSaveBO(ProductCategorySaveBO saveBO) {
        if (saveBO == null) {
            throw new BusinessException(CodeEnum.FAIL_100001.getCode(), "产品类型信息不能为空");
        }
        if (StrUtils.isEmpty(saveBO.getCategoryName())) {
            throw new BusinessException(CodeEnum.FAIL_100002.getCode(), "分类名称不能为空");
        }
        if (saveBO.getStatus() != null && (saveBO.getStatus() < 0 || saveBO.getStatus() > 1)) {
            throw new BusinessException(CodeEnum.FAIL_100004.getCode(), "状态必须为0（禁用）或1（启用）");
        }
        // 校验名称唯一性
        if (checkCategoryNameExists(saveBO.getCategoryName(), saveBO.getId())) {
            throw new BusinessException(CodeEnum.FAIL_100005.getCode(), "分类名称已存在");
        }
    }

    // 检查分类名称是否已存在
    private boolean checkCategoryNameExists(String categoryName, Long id) {
        EntityWrapper<ProductCategoryDTO> wrapper = new EntityWrapper<>();
        wrapper.eq("category_name", categoryName);
        if (id != null) { // 更新时排除自身
            wrapper.ne("id", id);
        }
        return this.selectCount(wrapper) > 0;
    }

    // 设置默认值
    private void setDefaultValues(ProductCategoryDTO dto) {
        dto.setRevision(dto.getRevision() != null ? dto.getRevision() : 0);
        dto.setStatus(dto.getStatus() != null ? dto.getStatus() : 1); // 默认启用
        Date now = new Date();
        dto.setCreateTime(dto.getCreateTime() != null ? dto.getCreateTime() : now);
        dto.setUpdateTime(dto.getUpdateTime() != null ? dto.getUpdateTime() : now);
    }
}